package com.asambleacristiana.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;

import com.asambleacristiana.domain.Usuario;
import com.asambleacristiana.repository.dao.DAOFactoryJPA;
import com.asambleacristiana.security.Autenticacion;

@ManagedBean
@ViewScoped
public class LoginBean implements Serializable {
	private static final long serialVersionUID = -6239437588285327644L;
	private String name;
	private String password;
	private String nuevoPassword;
	private String confirmPassword;

	@PostConstruct
	public void postContruct() {
	}

	public String success() {
		try {
			Usuario usu = DAOFactoryJPA.getInstance().getUsuarioDAO().iniciarSesion(name, password);
			List<String> permisos = DAOFactoryJPA.getInstance().getUsuarioDAO().findPermisos(usu.getApodo());
			usu.setPermisos(permisos);
			Autenticacion.setUsuarioLogueado(usu);
			if (!usu.getDebeCambiarPass()) {
				if (usu.getZonas().size() > 1) {
					return "seleccionZona";
				} else {
					usu.setZonaSeleccionada(usu.getZonas().get(0));
					return "menuUsuario";
				}
			} else {
				return "cambiarPass";
			}
		} catch (NoResultException e) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuario o Password incorrecto!", "Usuario o Password incorrecto!"));
			return null;
		}

	}

	public void cambiarPass() {
		Usuario usu = Autenticacion.getUsuarioLogueado();
		if (!usu.getPassword().equals(password)) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "El password actual es incorrecto.", "El password actual es incorrecto."));
		} else if (nuevoPassword.equals(password)) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "El nuevo password es igual al actual.", "El nuevo password es igual al actual."));
		} else if (!nuevoPassword.equals(confirmPassword)) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "El nuevo password no coincide con el de confirmación.",
							"El nuevo password no coincide con el de confirmación."));
		} else if (nuevoPassword.length() < 6 || nuevoPassword.length() > 11) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "El nuevo password debe tener entre 6 y 10 caracteres.",
							"El nuevo password debe tener entre 6 y 10 caracteres."));
		} else {
			usu.setPassword(nuevoPassword);
			usu.setDebeCambiarPass(false);
			if (DAOFactoryJPA.getInstance().getUsuarioDAO().update(usu)) {
				Autenticacion.salir();
			} else {
				FacesContext.getCurrentInstance().addMessage(null,
						new FacesMessage(FacesMessage.SEVERITY_ERROR, "Hubo un error al actualizar el password.", "Hubo un error al actualizar el password."));
			}
		}
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNuevoPassword() {
		return nuevoPassword;
	}

	public void setNuevoPassword(String nuevoPassword) {
		this.nuevoPassword = nuevoPassword;
	}

	public String getConfirmPassword() {
		return confirmPassword;
	}

	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
	}

}